package com.codi.bus.core.service;

import com.codi.bus.core.resultModel.BaseResult;
import com.codi.bus.core.resultModel.PortfolioSellLimitResult;
import com.codi.bus.core.resultModel.PortfolioTradeResult;
import com.codi.bus.core.service.model.*;
import com.codi.bus.core.vo.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 组合投资服务
 *
 * @author spy
 * @version 1.0 2017-11-06 16:21
 * @since 1.0
 */
public interface PortfolioService {


    /**
     * 获取组合交易限制
     *
     * @param userId
     * @param portfolioCode
     * @param capitalMode
     * @param businCode
     * @return
     */
    BaseResult getLimits(Long userId, String portfolioCode, String capitalMode, String businCode);


    /**
     * 获取每个组合中基金的限制
     *
     * @param vo
     * @return
     */
    PortfolioSellLimitResult getSellLimits(PortfolioSellLimitRequestVo vo);

    /**
     * 申购
     *
     * @param sessionVo
     * @param vo
     * @return
     */
    PortfolioTradeResult buy(SessionVo sessionVo, PortfolioTradeBuyVo vo);

    /**
     * 赎回 3.8
     *
     * @param sessionVo
     * @param vo
     * @return
     */
    PortfolioTradeResult sell38(SessionVo sessionVo, PortfolioTradeSellVo vo);

    /**
     * 撤单
     *
     * @param sessionVo
     * @param vo
     * @return
     */
    BaseResult undo(SessionVo sessionVo, PortfolioTradeUndoVo vo);


    /**
     * 获取组合中最高的风险等级
     *
     * @param fundCodes
     * @return
     */
    NewsModel getNewsModel(String[] fundCodes);

    /**
     * 获取组合申购费率
     *
     * @param userId
     * @param fundCodesStr
     * @return
     */
    PortfolioRate getApplyRate(Long userId, String fundCodesStr);


    /**
     * 获取组合赎回费用
     *
     * @param userId
     * @param fundCodesStr
     * @return
     */
    PortfolioRate getRedeemRate(Long userId, String fundCodesStr);

    /**
     * 获取组合交易的详情
     *
     * @param portfolioCode
     * @return
     */
    BaseResult getTradeDetail(Long userId, String portfolioCode);


    /**
     * 查询指定交易账号下组合总额
     *
     * @param newTradeAcco
     * @param portfolioCode
     * @return
     * @author spy
     * @version 1.0
     */
    BigDecimal queryAssertByNewTradeAcco(String newTradeAcco, String portfolioCode);


    /**
     * set trade status suc
     *
     * @param statusVo
     */
    void updateTradeStatusSuc(TradePortfolioStatusVo statusVo);

    /**
     * set trade status fail
     *
     * @param statusVo
     * @param
     */
    void updateTradeStatusFail(TradePortfolioStatusVo statusVo);


    /**
     * 获取组合中基金份额（按基金代码进行累加）
     *
     * @param portfolioCode
     * @param sharePortfolioMap
     * @return
     */
    Map<String, List<ShareDetailTotalModel>> getShareMap(List<String> portfolioCode, Map<String,
        List<ShareDetailQryModel>> sharePortfolioMap, Map<String, List<PortfolioQryModel>> portfolioMap);

    //Map<String,List<ShareDetailQryModel>> getShareDetail();

    /**
     * 非组合基金的份额明细 累加到一起
     *
     * @param shareDetailQryModels
     * @return
     */
    List<ShareDetailTotalModel> getShareWithoutPortfolio(List<ShareDetailQryModel> shareDetailQryModels);

    //获取组合  将不同组合存在不同的key中
    void getPortfolioMap(List<PortfolioQryModel> portfolioQryModels, Map<String,
        List<PortfolioQryModel>> portfolioMap, List<String> portfolioCode);

    //获取组合  将不同组合存在不同的key中
    void getCombMap(List<CombSharesQryModel> combSharesQryModels, Map<String,
        List<CombSharesQryModel>> combMap, List<String> portfolioCode);

    //获取组合  将不同交易账号的组合存在不同的key中
    void getCombTradeMap(List<CombSharesQryModel> combSharesQryModels, Map<String,
        List<CombSharesQryModel>> combTradeMap);


    void getCombMapByPortfolioCode(List<CombSharesQryModel> combSharesQryModels, Map<String, List<CombSharesQryModel>> combMap, List<String> portfolioCodes, String portfolioCode);

    void getCombTradeMapByPortfolioCode(List<CombSharesQryModel> combSharesQryModels, Map<String, List<CombSharesQryModel>> combTradeMap, String portfolioCode);

    /**
     * 将非组合基金 按交易账号查询后  按基金Code进行合并  因为和组合有关 所以放在这里
     */
    void getShareMap(List<ShareModel> shareModels, Map<String, ShareModel> shareMap);
}
